package com.quyunshuo.module.home.music

// LyricParser.kt
object LyricParser {
    // 使用正则表达式匹配LRC歌词格式
    // 格式说明: [分钟:秒.毫秒]歌词文本
    // 例如: [01:23.45]这是一句歌词
    // 正则解释:
    //   \[ - 匹配左方括号
    //   (\d+) - 匹配一个或多个数字（分钟部分）
    //   : - 匹配冒号
    //   (\d+\.\d+) - 匹配秒和毫秒部分（如23.45）
    //   \] - 匹配右方括号
    //   (.*) - 匹配剩余的歌词文本
    private val pattern = Regex("""\[(\d+):(\d+\.\d+)\](.*)""")

    /**
     * 解析LRC格式的歌词内容
     *
     * @param lrcContent LRC格式的歌词字符串
     * @return 解析后的歌词行列表，按时间排序
     */
    fun parseLrc(lrcContent: String): List<LyricLine> {
        // 将歌词内容按行分割，并转换为序列
        return lrcContent.lineSequence()
            // 对每一行进行解析，过滤掉无法解析的行
            .mapNotNull { parseLine(it) }
            // 按时间戳排序
            .sortedBy { it.time }
            // 转换为列表
            .toList()
    }

    /**
     * 解析单行歌词
     *
     * @param line 单行歌词文本
     * @return 解析后的LyricLine对象，如果无法解析则返回null
     */
    private fun parseLine(line: String): LyricLine? {
        // 使用正则表达式匹配歌词行
        return pattern.find(line)?.let { matchResult ->
            // 解构匹配结果：分钟、秒+毫秒、歌词文本
            val (min, sec, text) = matchResult.destructured

            // 将分钟转换为毫秒（1分钟 = 60秒 = 60,000毫秒）
            val minutesInMs = min.toLong() * 60 * 1000

            // 将秒+毫秒部分转换为毫秒
            val secondsInMs = (sec.toDouble() * 1000).toLong()

            // 计算总时间戳（毫秒）
            val timeMs = minutesInMs + secondsInMs

            // 创建LyricLine对象并返回
            LyricLine(timeMs, text.trim())
        }
    }
}